#include <vector>
#include <unordered_set>
#include <unordered_map>
using namespace std;

template<class T>				//如果是自定义类型记得重定义hash函数和比较函数
class CircleQueTimer			//要求每一秒调用一次
{
public:
	CircleQueTimer(size_t capacity) :_capacity(capacity), _cque(_capacity){}	//初始化的时候指定超时时间

	bool is_exist()																//判断当前位置是否有超时的集合
	{
		return !(_cque[_currIndex].empty());
	}																			//前进到下一个位置
	void _step()
	{
		_currIndex++;
		if (_currIndex >= _capacity)_currIndex = 0;
	}																			 //塞入一个
	void insert(T v)
	{
		if (_cmap.find(v) != _cmap.end())
		{
			_cque[_cmap[v]].erase(v);
		}
		_cque[_currIndex].insert(v);
		_cmap[v] = _currIndex;
	}																			   //塞入一坨
	void insert_group(unordered_set<T> _sets)
	{
		for (auto& it : _sets)
		{
			_cmap[it] = _currIndex;
		}
		_cque[_currIndex].insert(_sets.begin(), _sets.end());
	}
	unordered_set<T> getCurr()														//获取当前位置的一坨
	{
		return _cque[_currIndex];
	}

	void _erase(unordered_set<T> needtoe)											//删除一坨，可以把上面getcurr结果直接返回进来
	{
		if (needtoe.empty())return;
		for (auto& it : needtoe)
		{
			if (!_cque[_cmap[it]].empty()) //非空删除
			{
				_cque[_cmap[it]].erase(it);
				_cmap.erase(it);
			}
		}
	}

	void _erase_one(T k)
	{
		if(_cmap.find(k) == _cmap.end())return;
		_cque[_cmap[k]].erase(k);
		_cmap.erase(k);
	}
private:
	size_t _capacity;		//超时时间
	size_t _currIndex = 0;	//下标索引
	
	vector<unordered_set<T>> _cque;
	unordered_map<T, size_t> _cmap;
};